/*
 * Copyright 2014 Щекотова Ангелина Александровна.
 * Этот файл — часть J4JClientServer Framework
 * J4JClientServer Framework - свободная программа: вы можете перераспространять ее и/или изменять
 * ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде, в каком
 * она была опубликована Фондом свободного программного обеспечения; либо
 * версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 *
 * J4JClientServer Framework распространяется в надежде, что она будет полезной,
 * но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 * или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 * общественной лицензии GNU.
 *
 * Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 * вместе с этой программой. Если это не так, см.
 * <http://www.gnu.org/licenses/>.
 */

package ru.java4java.utils;

import java.util.LinkedList;
import java.util.List;

public final class ThreadUtils {

    private static LinkedList<Thread> threads = null;
    private static final Object threads_lock = new Object();

    private static void initThreadList() {
        if (threads == null) {
            threads = new LinkedList<>();
        }
    }

    public static void registerThread(Thread thread) {
        synchronized (threads_lock) {
            initThreadList();
            threads.addFirst(thread);
        }
    }

    public static void getThread(int index) {
        synchronized (threads_lock) {
            initThreadList();
            threads.get(index);
        }
    }

    public static int threadCount() {
        synchronized (threads_lock) {
            return threads.size();
        }
    }

    public static void unregisterThread(Thread thread) {
        synchronized (threads_lock) {
            threads.remove(thread);
        }
    }

    public static void unregisterThread(int index) {
        synchronized (threads_lock) {
            threads.remove(index);
        }
    }

    public static List<Thread> getAllRegisteredThreads() {
        return new LinkedList<>(threads);
    }

    public static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException ignored) {
        }
    }

    public static void unsafeSleep(long ms) {
        long start = System.currentTimeMillis();
        while (true) {
            try {
                Thread.sleep(ms); break;
            } catch (InterruptedException e) {
                ms -= System.currentTimeMillis() - start;
                if (ms <= 0) break;
            }
        }
    }

}
